import {isNone} from 'st-common-core'
import {StnDataTableColumn} from '../types/stn-table.ts'

/**
 * 生成表格组件的列配置
 *
 * @param {string} title 列标题
 * @param {string} key 行数据对象中要显示在该列的字段键名
 * @param {number} width 列宽度，单位为像素，默认为 undefined，只有当传递了该参数时（即函数该参数不为空）才会向列配置中添加 width 属性
 * @param {boolean} isEllipsis 该列单元格的内容文本超出宽度限制时是否显示省略号
 * @param {Record<string, any>} otherOptions 表格组件列的其他配置项，只有当传递了该参数时（即函数该参数不为空）才会将该参数中的其他列配置
 * 项添加到生成的列配置中，需要注意的是，该参数中的列配置项会覆盖生成的列配置中同名的配置项
 * @returns {StnDataTableColumn} 表格组件的列配置
 */
export const genTableCol = (
  title: string,
  key: string,
  width?: number,
  isEllipsis: boolean = false,
  otherOptions?: Record<string, any>
): StnDataTableColumn => {
  const col: StnDataTableColumn = {
    title,
    key,
  }
  if (!isNone(width)) col.width = width
  if (isEllipsis) col.ellipsis = {
    tooltip: true
  }
  return isNone(otherOptions) ? col : ({...col, ...otherOptions}) as StnDataTableColumn
}

/**
 * 生成表格组件固定在左侧的列配置
 *
 * @param {string} title 列标题
 * @param {string} key 行数据对象中要显示在该列的字段键名
 * @param {number} width 列宽度，单位为像素，默认为 undefined，只有当传递了该参数时（即函数该参数不为空）才会向列配置中添加 width 属性
 * @param {boolean} isEllipsis 该列单元格的内容文本超出宽度限制时是否显示省略号
 * @param {Record<string, any>} otherOptions 表格组件列的其他配置项，只有当传递了该参数时（即函数该参数不为空）才会将该参数中的其他列配置
 * 项添加到生成的列配置中，需要注意的是，该参数中的列配置项会覆盖生成的列配置中同名的配置项
 * @returns {StnDataTableColumn} 表格组件的列配置
 */
export const genLeftFixedTableCol = (
  title: string,
  key: string,
  width?: number,
  isEllipsis: boolean = false,
  otherOptions: Record<string, any> = {}
): StnDataTableColumn => {
  return genTableCol(
    title,
    key,
    width,
    isEllipsis,
    {
      fixed: 'left',
      ...otherOptions
    }
  )
}

/**
 * 生成表格组件固定在右侧的列配置
 *
 * @param {string} title 列标题
 * @param {string} key 行数据对象中要显示在该列的字段键名
 * @param {number} width 列宽度，单位为像素，默认为 undefined，只有当传递了该参数时（即函数该参数不为空）才会向列配置中添加 width 属性
 * @param {boolean} isEllipsis 该列单元格的内容文本超出宽度限制时是否显示省略号
 * @param {Record<string, any>} otherOptions 表格组件列的其他配置项，只有当传递了该参数时（即函数该参数不为空）才会将该参数中的其他列配置
 * 项添加到生成的列配置中，需要注意的是，该参数中的列配置项会覆盖生成的列配置中同名的配置项
 * @returns {StnDataTableColumn} 表格组件的列配置
 */
export const genRightFixedTableCol = (
  title: string,
  key: string,
  width?: number,
  isEllipsis: boolean = false,
  otherOptions: Record<string, any> = {}
): StnDataTableColumn => {
  return genTableCol(
    title,
    key,
    width,
    isEllipsis,
    {
      fixed: 'right',
      ...otherOptions
    }
  )
}
